home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dprint / dp_fmenu.c < prev    next >
Text File  |  1995-01-04  |  4KB  |  219 lines

  1. /*
  2.  
  3. 8086|Printman/POSTCARD ファイル操作メニューモジュール
  4.  
  5. Copyright (c) 1993,94 Delmonta
  6.  
  7. */
  8.  
  9. #include<dos.h>
  10. #include<string.h>
  11. #include<jctype.h>
  12. #include"dprint.h"
  13.  
  14. /*---------------------------------------------------------------------------*/
  15.  
  16. bool    Changedflag = FALSE;
  17.  
  18. bool    dp_isallsure(void)
  19. {
  20.     if    (!Changedflag)
  21.         return TRUE;
  22.     else
  23.     {
  24.         char    c;
  25.     isallsure_rep:
  26.  
  27.         c = dp_errmes("カードを保存していません.よろしいですか(y/n):");
  28.  
  29.         if    (c=='y' || c=='Y')
  30.             return TRUE;
  31.         else if    (c=='n' || c=='N')
  32.             return FALSE;
  33.         else
  34.         {
  35.             if    (c==EXTKEY_H)
  36.                 dp_getch();
  37.  
  38.             putchar('\7');
  39.             goto isallsure_rep;
  40.         }
  41.     }
  42. }
  43.  
  44. /*---------------------------------------------------------------------------*/
  45.  
  46. void    dp_readfile(FILE *fp)
  47. {
  48. static    const    char    READERROR[] = "読み込みに失敗しました.";
  49.     struct POSTCARD    readdata;
  50.     char        buf[256];
  51.     unsigned    i;
  52.  
  53.     while    (1)
  54.     {
  55.         if    (fgets(buf,sizeof(buf),fp)==NULL)
  56.         {
  57.             if    (!feof(fp))
  58.                 dp_errmes(READERROR);
  59.  
  60.             goto whilebreak;
  61.         }
  62.  
  63.         switch    (sscanf(buf,"%u-%u",&readdata.zipcode[0],
  64.                             &readdata.zipcode[1]))
  65.         {
  66.         case  0:    readdata.zipcode[0] = -1;    break;
  67.         case  1:    readdata.zipcode[1] = -1;    break;
  68.         case -1:    goto whilebreak;
  69.         }
  70.  
  71.         for    (i=0 ; i<5 ; i++)
  72.         {
  73.             char    *p;
  74.  
  75.             if    (fgets(buf,sizeof(buf)-1,fp)==NULL)
  76.             {
  77.                 dp_errmes(READERROR);
  78.                 goto whilebreak;
  79.             }
  80.  
  81.             p = strchr(buf,'\n');
  82.             if    (p!=NULL)
  83.                 *p = '\0';
  84.  
  85.             if    (strlen(buf)>24)
  86.             {
  87.                 if    (nthctype(buf,23)==CT_KJ1)
  88.                     buf[23] = '\0';
  89.                 else
  90.                     buf[24] = '\0';
  91.             }
  92.  
  93.             strcpy(readdata.data[i],buf);
  94.         }
  95.  
  96.         if    (!addcard(Cardnum))
  97.             goto whilebreak;    /* メモリ不足のエラーメッ  */
  98.                         /* セージはaddcard()が出す */
  99.  
  100.         *Card[Cardnum++] = readdata;
  101.     }
  102. whilebreak:
  103.     fclose(fp);
  104.  
  105.     dp_putcardnum();
  106.     card_reshow(63);
  107. }
  108.  
  109. /*---------------------------------------------------------------------------*/
  110.  
  111. static    void    dp_fmergemenu(void)
  112. {
  113.     FILE    *fp = fileselector("r",NULL);
  114.  
  115.     if    (fp!=NULL)
  116.         dp_readfile(fp);
  117.  
  118.     Changedflag = TRUE;
  119. }
  120.  
  121. /*---------------------------------------------------------------------------*/
  122.  
  123. static    void    dp_freadmenu(void)
  124. {
  125.     FILE    *fp;
  126.  
  127.     if    (!dp_isallsure())
  128.         return;
  129.  
  130.     fp = fileselector("r",NULL);
  131.     if    (fp!=NULL)
  132.     {
  133.         while    (Cardnum)
  134.             farfree(Card[--Cardnum]);
  135.  
  136.         Cardpos = 0;
  137.  
  138.         dp_readfile(fp);
  139.     }
  140.     Changedflag = FALSE;
  141. }
  142.  
  143. /*---------------------------------------------------------------------------*/
  144.  
  145. static    void    dp_fwritemenu(void)
  146. {
  147.     int    s,e;
  148.     FILE    *fp;
  149.  
  150. fwmenu_rep:
  151.     if    (!input_st_ed("保存",&s,&e))
  152.         return;
  153.  
  154.     fp = fileselector("w",NULL);
  155.     if    (fp==NULL)
  156.         goto fwmenu_rep;
  157.  
  158.     for    ( ; s<=e ; s++)
  159.     {
  160.         struct POSTCARD    writedata = *Card[s];
  161.         unsigned    i;
  162.  
  163.     static    const    char    FWRITE_ERR[] = "書き込み中にエラーが"
  164.                     "発生しました. 書き込みを中止します.";
  165.  
  166.  
  167.         if    (writedata.zipcode[0] == -1)
  168.             i = fprintf(fp,"   -  \n");
  169.         else if    (writedata.zipcode[1] == -1)
  170.             i = fprintf(fp,"%03d-  \n",writedata.zipcode[0]);
  171.         else
  172.             i = fprintf(fp,"%03d-%02d\n",writedata.zipcode[0],
  173.                             writedata.zipcode[1]);
  174.  
  175.         if    (i==-1)
  176.         {
  177.             dp_errmes(FWRITE_ERR);
  178.             goto fwmenu_break;
  179.         }
  180.  
  181.         for    (i=0 ; i<5 ; i++)
  182.         {
  183.             if    (fprintf(fp,"%s\n",writedata.data[i])==-1)
  184.             {
  185.                 dp_errmes(FWRITE_ERR);
  186.                 goto fwmenu_break;
  187.             }
  188.         }
  189.     }
  190.     dp_errmes("書き込みを終了しました.");
  191.     Changedflag = FALSE;
  192.  
  193. fwmenu_break:
  194.  
  195.     fclose(fp);
  196. }
  197.  
  198. /*---------------------------------------------------------------------------*/
  199.  
  200. void    dp_filemenu(void)
  201. {
  202. static    struct    MENUDAT    menu[]=
  203.     {
  204.         {'L',"読み込み","ファイルに保存したカードを読み込みます"},
  205.         {'M',"追加読み込み","ファイルに保存したカードを現在のカードに追加します"},
  206.         {'S',"保存","カードをファイルに保存します"},
  207.     };
  208.  
  209.     int    a = dp_menuselect("コマンドを選択してください.",3,menu);
  210.  
  211.     switch    (a)
  212.     {
  213.     case -1:                break;
  214.     case  0:    dp_freadmenu();        break;
  215.     case  1:    dp_fmergemenu();    break;
  216.     case  2:    dp_fwritemenu();    break;
  217.     }
  218. }
  219.